package wczytywanieobrazkow;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

import typydanych.Naglowek;
import typydanych.Obrazek;

public class WczytywanieObrazkow {

	DataInputStream strumienObrazkow = null;
	DataInputStream strumienEtykiet = null;
	Naglowek naglowekObrazkow = null;
	Naglowek naglowekEtykiet = null;
	private String nazwaPlikuEtykiet = null;
	private String nazwaPlikuObrazkow = null;
	private int licznikWczytanychEtykiet = 0;
	private int licznikWczytanychObrazkow = 0;
	public static final int ROZMIAR_BUFORA = 1000;
	private int iloscObrazkow = -1;

	public int getIloscObrazkow() {
		if (iloscObrazkow > -1) {
			return iloscObrazkow;
		}
		throw new IllegalArgumentException();
	}

	public WczytywanieObrazkow(String nazwaPlikuObrazkow, String nazwaPlikuEtykiet) {
		this.nazwaPlikuEtykiet = nazwaPlikuEtykiet;
		this.nazwaPlikuObrazkow = nazwaPlikuObrazkow;
	}

	public DataInputStream getStrumienObrazkow() throws FileNotFoundException {
		if (strumienObrazkow == null) {
			strumienObrazkow = zwrocStrumien(nazwaPlikuObrazkow);
		}
		return strumienObrazkow;
	}

	public DataInputStream getStrumienEtykiet() throws FileNotFoundException {
		if (strumienEtykiet == null) {
			strumienEtykiet = zwrocStrumien(nazwaPlikuEtykiet);
		}
		return strumienEtykiet;
	}

	public ArrayList<Byte> wczytajEtykiety() throws IOException {
		DataInputStream strumien = getStrumienEtykiet();
		if (naglowekEtykiet == null) {
			naglowekEtykiet = wczytajNaglowek(strumien);
			iloscObrazkow = naglowekEtykiet.getListaWymiarow().get(0);
		}

		int limit = naglowekEtykiet.getListaWymiarow().get(0);
		if (naglowekEtykiet.getListaWymiarow().get(0) > ROZMIAR_BUFORA) {
			limit = ROZMIAR_BUFORA;
		}
		ArrayList<Byte> etykiety = new ArrayList<Byte>();
		for (int i = 0; i < limit; i++) {
			etykiety.add(wczytajEtykiete(strumien));
			if (++licznikWczytanychEtykiet >= naglowekEtykiet.getListaWymiarow().get(0))
				break;
		}
		return etykiety;
	}

	public static Byte wczytajEtykiete(DataInputStream input) throws IOException {
		Byte etykieta = (byte) input.readUnsignedByte();
		return etykieta;
	}

	public ArrayList<Obrazek> wczytajObrazki() throws IOException {
		DataInputStream strumien = getStrumienObrazkow();

		if (naglowekObrazkow == null) {
			naglowekObrazkow = wczytajNaglowek(strumien);
			iloscObrazkow = naglowekObrazkow.getListaWymiarow().get(0);
		}
		int limit = naglowekObrazkow.getListaWymiarow().get(0);
		if (naglowekObrazkow.getListaWymiarow().get(0) > ROZMIAR_BUFORA) {
			limit = ROZMIAR_BUFORA;
		}
		ArrayList<Obrazek> obrazki = new ArrayList<Obrazek>();
		for (int i = 0; i < limit; i++) {
			obrazki.add(wczytajObrazek(strumien));
			if (++licznikWczytanychObrazkow >= naglowekObrazkow.getListaWymiarow().get(0))
				break;
		}
		return obrazki;
	}

	public static ArrayList<Obrazek> wczytajObrazki(String nazwaPliku, int index) throws IOException {
		DataInputStream strumien = zwrocStrumien(nazwaPliku);
		wczytajNaglowek(strumien);
		ArrayList<Obrazek> obrazki = new ArrayList<Obrazek>();
		for (int i = 0; i < index + 1; i++) {
			obrazki.add(wczytajObrazek(strumien));
		}

		return obrazki;
	}

	public static DataInputStream zwrocStrumien(String nazwa_pliku) throws FileNotFoundException {
		return new DataInputStream(new FileInputStream(nazwa_pliku));
	}

	public static Naglowek wczytajNaglowek(DataInputStream input) throws IOException {
		Naglowek naglowek = new Naglowek();
		int bajt;
		for (int i = 0; i < 4; i++) {
			bajt = input.readUnsignedByte();
			if (i < 2 && bajt != 0) {
				throw new IOException("Podany plik nie jest w obsługiwanym formacie");
			}

			switch (i) {
			case 2:
				naglowek.setTypDanych(bajt);
				break;
			case 3:
				naglowek.setIloscWymiarow(bajt);
				break;
			default:
			}
		}

		int intiger;
		for (int i = 0; i < naglowek.getIloscWymiarow(); i++) {
			intiger = input.readInt();
			naglowek.getListaWymiarow().add(intiger);
		}
		return naglowek;
	}

	@SuppressWarnings("deprecation")
	public static Obrazek wczytajObrazek(DataInputStream input) throws IOException {
		Obrazek obrazek = new Obrazek();
		for (int x = 0; x < Obrazek.ROZMIAR; x++) {
			for (int y = 0; y < Obrazek.ROZMIAR; y++) {
				obrazek.getObrazek()[x][y] = input.readUnsignedByte();
			}
		}
		return obrazek;
	}
}
